休眠 - 一对多关系 [英] Hibernate - one to Many relationship

查看:133
本文介绍了休眠 - 一对多关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用hibernate一对多关系来保存并获取我的数据,
我在阅读数据时获得代理商的价值,但是在数据库中保存代理商价值时,它并未插入。



任何人都可以帮助我知道自己在做什么错误在我的jsp中,我使用下面的代码以展示代理机构下拉列表

 < div class =clearfix>< / div> 
< div class =form-group>
< label for =agencyclass =col-sm-2 control-label>代理商< / label>
< div class =col-sm-10>
< form:select path =agenciesclass =form-control>
< c:forEach items =$ {agencies}var =agency>
< option value =$ {agency.agency_id}> $ {agency.name}< / option>
< / c:forEach>
< / form:select>
< / div>
< / div>

我的广告系列实体就像

  package com.nativeunlock.dto; 

import java.io.Serializable;

import javax.persistence。*;
import org.hibernate.annotations.Parameter;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.GenericGenerator;

import lombok.Getter;
import lombok.Setter;

$ b @SuppressWarnings(serial)
@NamedQueries({
@NamedQuery(
name = CampaignEntity.GET_CAMPAIGNS_QUERY,
query = 来自CampaignEntity广告系列
),
@NamedQuery(
name = CampaignEntity.DELETE_CAMPAIGNS_QUERY,
query =删除CampaignEntity广告系列WHERE campaign.campaign_id =:campaign_id

@NamedQuery(
name = CampaignEntity.GET_CAMPAIGN_QUERY,
query =FROM CampaignEntity campaign WHERE campaign.campaign_id =:campaign_id

})

@Entity
@Table(name =campaign)
public class CampaignEntity implements Serializable {

public static final String GET_CAMPAIGNS_QUERY =getCampaignList;
public static final String DELETE_CAMPAIGNS_QUERY =deleteCampaignList;
public static final String GET_CAMPAIGN_QUERY =getCampaign;

@Id
@Getter
@Setter
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =campaign_id,unique = true,nullable = false)
private int campaign_id;

@Getter
@Setter
@Column(name =name,unique = true)
// @ NotEmpty(message =Name field is mandatory。 )
私人字符串名称;


@Getter
@Setter
@Column(name =no_of_views)
// @ NotNull(message =No of Views字段)
private int no_of_views;

@Getter
@Setter
@Column(name =video_url)
// @ NotEmpty(message =视频URL字段是必需的)
private String video_url;

@Getter
@Setter
@Column(name =start_date)
// @ NotEmpty(message =开始日期字段是必需的。 b $ b private String start_date;

@Getter
@Setter
@Column(name =end_date)
// @ NotEmpty(message =End Date field is mandatory。)
private String end_date;

@Getter
@Setter
@Column(name =click_to_play)
// @NotNull(message =点击播放字段是强制性的。)
private int click_to_play;

@Getter
@Setter
@Column(name =frequency)
// @NotNull(message =频率字段是强制性的。)
私有int频率;

@Getter
@Setter
@Column(name =priority)
@Digits(fraction = 0,integer = 100)
// @NotNull(message =Priority field is mandatory。)
private int priority;

@Getter
@Setter
@Column(name =divice)
// @ NotNull(message =Divice field is mandatory。)
private int divice;

@Getter
@Setter
@Column(name =operating_system)
// @NotNull(message =操作系统字段是必需的)
private int operating_system;

@Getter
@Setter
@Column(name =google_analytics_id)
@NotNull(message =Google analytics Id field is mandatory。)
private String google_analytics_id;

@Getter
@Setter
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name =publisher_id)
Private PublisherEntity publishers;

@Getter
@Setter
@ManyToOne
@JoinColumn(name =agency_id)
私营AgencyEntity机构;
$ b $覆盖
public String toString(){
returnCampaignEntity [campaign_id =+ campaign_id +,name =+ name
+,no_of_views = + no_of_views +,video_url =+ video_url
+,start_date =+ start_date +,end_date =+ end_date
+,click_to_play =+ click_to_play +,frequency =
+ frequency +,priority =+ priority +,divice =+ divice
+,operating_system =+ operating_system
+,google_analytics_id =+ google_analytics_id
+ ,publishers =+ publishers +,agencies =+ agencies +];


而我的代理实体就像

  package com.nativeunlock.dto; 

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence。*;

import lombok.Getter;
import lombok.Setter;

$ b @SuppressWarnings(serial)
@NamedQueries({
@NamedQuery(
name = AgencyEntity.GET_AGENCIES_QUERY,
query = from AgencyEntity agnecy

$)b
$ b @Entity
@Table(name =agency)
public class AgencyEntity实现Serializable {

public static final String GET_AGENCIES_QUERY =getAgencyList;

@Id
@Getter
@Setter
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =agency_id,unique = true,nullable = false)
private int agency_id;


@Getter
@Setter
@Column(name =name)
私人字符串名称;

@OneToMany(的mappedBy = 机构,级联= {CascadeType.PERSIST,CascadeType.REMOVE})
@ org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType .SAVE_UPDATE})
私人设置< CampaignEntity> campaigns = new HashSet< CampaignEntity>();


以下是插入记录的代码

  @覆盖
公共布尔saveCampaign(CampaignEntity campaignObj){
尝试{
会话会话的getCurrentSession =();
session.beginTransaction();
session.saveOrUpdate(campaignObj);
session.getTransaction()。commit();
返回true;
} catch(Exception e){
e.printStackTrace();
}
返回false;
}

预先致谢

解决方案

尝试更换 session.beginTransaction() session.getTransaction()然后提交该事务。如果春天是管理你的交易,交易可能已经存在,你不需要自己开始另一个。

  @覆盖
public boolean saveCampaign(CampaignEntity campaignObj){
try {
Session session = getCurrentSession();
session.getTransaction()。begin();
session.saveOrUpdate(campaignObj);
session.getTransaction()。commit();
返回true;
} catch(Exception e){
e.printStackTrace();
}
返回false;
}


I am using hibernate one to many relationship to save and get my data, I am getting value of agency when reading data but when saving agency value in database it is not inserting.

Can any one help me to know what wrong I am doing

In my jsp I am using following code to show agency dropdown

<div class = "clearfix"></div>
                        <div class="form-group">
                            <label for="agency" class="col-sm-2 control-label">Agency</label>
                            <div class="col-sm-10">                             
                                <form:select path="agencies" class = "form-control">
                                    <c:forEach items="${agencies}" var="agency">                                        
                                       <option value="${agency.agency_id}" >${agency.name}</option>                                        
                                    </c:forEach>
                                </form:select>                          
                            </div>
                        </div>

my campaign entity is like

package com.nativeunlock.dto;

import java.io.Serializable;

import javax.persistence.*;
import org.hibernate.annotations.Parameter;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.GenericGenerator;

import lombok.Getter;
import lombok.Setter;


@SuppressWarnings("serial")
@NamedQueries({
    @NamedQuery(
            name = CampaignEntity.GET_CAMPAIGNS_QUERY,
            query = "from CampaignEntity campaign"
    ),
    @NamedQuery(
            name = CampaignEntity.DELETE_CAMPAIGNS_QUERY,
            query = "DELETE FROM CampaignEntity campaign WHERE campaign.campaign_id = :campaign_id"
    ),
    @NamedQuery(
            name = CampaignEntity.GET_CAMPAIGN_QUERY,
            query = "FROM CampaignEntity campaign WHERE campaign.campaign_id = :campaign_id"
    )    
})

@Entity
@Table(name = "campaign")
public class CampaignEntity implements Serializable {

    public static final String GET_CAMPAIGNS_QUERY ="getCampaignList";
    public static final String DELETE_CAMPAIGNS_QUERY ="deleteCampaignList";
    public static final String GET_CAMPAIGN_QUERY = "getCampaign";

    @Id
    @Getter
    @Setter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "campaign_id", unique = true, nullable = false)
    private int campaign_id;

    @Getter
    @Setter
    @Column(name = "name", unique = true)
    //@NotEmpty(message="Name field is mandatory.")
    private String name;


    @Getter
    @Setter
    @Column(name = "no_of_views")
    //@NotNull(message="No. of Views field is mandatory.")
    private int no_of_views;

    @Getter
    @Setter
    @Column(name = "video_url") 
    //@NotEmpty(message="Video URL field is mandatory.")
    private String video_url;

    @Getter
    @Setter
    @Column(name = "start_date")    
    //@NotEmpty(message="Start Date field is mandatory.")
    private String  start_date;

    @Getter
    @Setter
    @Column(name = "end_date")
    //@NotEmpty(message="End Date field is mandatory.")
    private String end_date;

    @Getter
    @Setter
    @Column(name = "click_to_play")
    //@NotNull(message="Click to play field is mandatory.")
    private int click_to_play;

    @Getter
    @Setter
    @Column(name = "frequency")
    //@NotNull(message="Frequency field is mandatory.")
    private int frequency;

    @Getter
    @Setter
    @Column(name = "priority")
    @Digits(fraction = 0, integer = 100)
    //@NotNull(message="Priority field is mandatory.")
    private int priority;

    @Getter
    @Setter
    @Column(name = "divice")
    //@NotNull(message="Divice field is mandatory.")
    private int divice;

    @Getter
    @Setter
    @Column(name = "operating_system")
    //@NotNull(message="Operating system field is mandatory.")
    private int operating_system;   

    @Getter
    @Setter
    @Column(name = "google_analytics_id")
    @NotNull(message="Google analytics Id field is mandatory.")
    private String google_analytics_id;

    @Getter
    @Setter
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "publisher_id")
    private PublisherEntity publishers;

    @Getter
    @Setter
    @ManyToOne
    @JoinColumn(name = "agency_id")
    private AgencyEntity agencies;

    @Override
    public String toString() {
        return "CampaignEntity [campaign_id=" + campaign_id + ", name=" + name
                + ", no_of_views=" + no_of_views + ", video_url=" + video_url
                + ", start_date=" + start_date + ", end_date=" + end_date
                + ", click_to_play=" + click_to_play + ", frequency="
                + frequency + ", priority=" + priority + ", divice=" + divice
                + ", operating_system=" + operating_system
                + ", google_analytics_id=" + google_analytics_id
                + ", publishers=" + publishers + ", agencies=" + agencies + "]";
    }           
}

And my agency entity is like

package com.nativeunlock.dto;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;

import lombok.Getter;
import lombok.Setter;


@SuppressWarnings("serial")
@NamedQueries({
    @NamedQuery(
            name = AgencyEntity.GET_AGENCIES_QUERY,
            query = "from AgencyEntity agnecy"
    )     
})

@Entity
@Table(name = "agency")
public class AgencyEntity implements Serializable {

    public static final String GET_AGENCIES_QUERY ="getAgencyList";

    @Id
    @Getter
    @Setter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "agency_id", unique = true, nullable = false)
    private int agency_id;


    @Getter
    @Setter
    @Column(name = "name")  
    private String name;

    @OneToMany (mappedBy="agencies", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    @org.hibernate.annotations.Cascade( {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    private Set<CampaignEntity> campaigns = new HashSet<CampaignEntity>();

}

following is code to insert record

@Override
    public boolean saveCampaign(CampaignEntity campaignObj) {
        try{
            Session session=getCurrentSession();
            session.beginTransaction();
            session.saveOrUpdate(campaignObj);
            session.getTransaction().commit();
            return true;
        } catch(Exception e) {
            e.printStackTrace();
        }
        return false;
    }

Thanks in advance

解决方案

Try replacing session.beginTransaction() with session.getTransaction() and then commiting that transaction. If Spring is managing your transactions, the transaction probably already exists, and you don't need to start another one yourself.

@Override
public boolean saveCampaign(CampaignEntity campaignObj) {
    try{
        Session session = getCurrentSession();
        session.getTransaction().begin();
        session.saveOrUpdate(campaignObj);
        session.getTransaction().commit();
        return true;
    } catch(Exception e) {
        e.printStackTrace();
    }
    return false;
}

这篇关于休眠 - 一对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆