我在使用 Hibernate 时遇到了一些问题,当我期望它不会抛出异常时。简而言之,我有一个实体映射到具有所需 FK 的表(由 Hibernate 生成的表);如果在 Java 中正确指定了 FK,则一切正常。但是,如果省略 FK,则实体不会保存到 DB。很好——但我没有得到例外session.save()
,甚至在transaction.commit()
; 我只有在尝试加载实体时才意识到这个问题。这使得调试成为一场噩梦。当然,当我提交时,Hibernate应该最迟发出某种错误?
我不知道错误可能来自哪里,所以我不太确定如何包含适当的特定信息。欢迎任何提示。
伪代码:
try {
tx = session.beginTransaction();
MyEntity me = new MyEntity();
me.setName("Foo");
// Omitting to call me.setSomeFK(someOtherEntity);
session.save(me);
tx.commit();
System.out.println("Everything is OK");
}
catch (Exception e) {
tx.rollback();
}
可悲的是,它认为“ Everything is OK
”。一切都不正常。
实体代码(示例):
不幸的是,我无法展示全部内容,但是
GenericParticipantEntity.java
:
@Entity
@Table
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name = "participant_type",
discriminatorType = DiscriminatorType.STRING,
length = 16
)
abstract public class GenericParticipantEntity {
private long participantId;
private StatEventEntity event;
private SeasonEventEntity seasonEvent;
// A bunch of other fields
@Id
@Column(name = "participantId")
@GeneratedValue(strategy = GenerationType.AUTO)
public long getParticipantId() {
return participantId;
}
public void setParticipantId(long participantId) {
this.participantId = participantId;
}
@ManyToOne(targetEntity = StatEventEntity.class, optional = false)
@JoinColumn(name = "stat_event_id")
public StatEventEntity getEvent() {
return event;
}
public void setEvent(StatEventEntity event) {
this.event = event;
}
@ManyToOne
@JoinColumn(name = "season_event_id", nullable = false)
public SubSeasonEventEntity getSeasonEvent() {
return seasonEvent;
}
public void setSeasonEvent(SubSeasonEventEntity seasonEvent) {
this.seasonEvent = seasonEvent;
}
}
SpecificParticipant.java
(这个真的不包含代码):
@Entity
@DiscriminatorValue("specific1")
public class SpecificParticipant extends GenericParticipantEntity { }
用法:
Transaction tx;
Long id = null;
try {
tx = session.beginTransaction();
SpecificParticipant somePlayer = new SpecificParticipant();
somePlayer.setEvent(someEvent);
id = session.save(somePlayer);
tx.commit();
}
catch (Throwable e) {
if (tx != null) tx.rollback();
throw e;
}
请注意,我忘记设置seasonEvent
属性,所以当然INSERT
查询最终会失败——它应该失败;这是我的错误。令我困惑的是,Hibernate 在这里没有抛出异常;相反,当我尝试基于 加载对象时,我发现了问题,id
数据库中没有要加载的内容。
SQL 完全由 Hibernate 生成,所以如果 DDL 中出现错误,那肯定是由于 Java 代码中的错误。