休眠级联PERSIST

问题描述:

我有一个关于休眠的一般问题,我打电话。休眠级联PERSIST

我有A类和B类,B是依赖于

在我的代码,当我打电话em.persist(objOfTypeA)我希望插入去,并插入到两个表AAA和BBB。如果我手动设置A获得A的ID并将其填充到每个对象的列表中,然后保留该列表,那么事情就会起作用。 但我希望这发生在Hibernate的神奇

我做错了什么? 或者我只是期待太多的Hibernate?

感谢

@Entity 
@Table(name = "AAA") 
@Veto 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    private Long id; 


    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    ... 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    private List<B> b; 
... 
} 

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId") 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

我终于搞定了。 无我被赋予或发现的例子告诉我到底什么是错的,这是只有在我自己的实验,我成功地得出这样的结论:

,而不必

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<B> b; 

这没”将不起作用(FK仍然为NULL来)

该做的工作:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
@JoinColumn(name="AId") 
@NotNull 
private List<B> b; 
+0

这不适合我。问题在于Hibernate希望在持久化之前将A设置在B上。这工作:http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship – 2016-01-11 03:48:01

修改B如下类的映射,

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId", updatable = false, insertable = false) 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id") 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

你用在错误的地方属性updatable = false, insertable = false,我已经改正了。

阅读here了解它们是如何工作的。

+0

嗨ManuPK, 谢谢您回答,但这并没有解决我的问题。 虽然试图坚持(A)我得到一个错误,aId B为空。 ConstraintViolationImpl {interpolatedMessage ='may not be null',propertyPath = aId,rootBeanClass = class com.test.model.B,messageTemplate ='{javax.validation.constraints.NotNull.message}'} 我不确定如果在SQL Server端,我必须将id(A和B)作为标识,否则Hibernate会处理这个问题?但我认为没关系,因为它没有抱怨它在FK上抱怨。 – WonkeyDonkey 2012-02-26 12:44:05

+0

DB正在寻找这样的: 表1:AAA 标识BIGINT NOT NULL, 名称为varchar(100) 表2:BBB 标识BIGINT NOT NULL, 援助BIGINT NOT NULL, 名称为varchar(100) 谢谢! – WonkeyDonkey 2012-02-26 12:44:40

+0

我回到数据库并从AId中删除'not null',并从B类中的aId中删除了 @NotNull。现在坚持是成功的但是当我看着数据库。 AAA是好的,但BBB缺少AId。 帮助.. – WonkeyDonkey 2012-02-26 13:01:34