0

我正在尝试找到一种方法来检索通过级联持久保存在数据库中的实体的自动生成的 ID。我正在使用 Hibernate 4.1.9、Spring 数据 1.2 和 Spring 框架 3.2.1。以下是有问题的实体:位置、家庭、房间。

位置父类

@Entity
@Table(name = "location")
@Inheritance(strategy = InheritanceType.JOINED)
public class Location implements Serializable
{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "location_id", unique = true)
private long uuid;

// other attributes and methods not relevant
}

扩展 Location 的 Home 类,引用一组 Rooms

@Entity
@Table(name = "home")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "home_id")
public class Home extends Location implements Serializable
{

@OneToMany(mappedBy = "containingHome", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Room> rooms;
// other attributes and methods not relevant
}

最后是引用 Home 对象的 Room 类

@Entity
@Table(name = "room")
@PrimaryKeyJoinColumn(name = "room_id")
public class Room extends Location implements Serializable
{

@ManyToOne()
@JoinColumn(name = "home_id")
protected Home containingHome;
// other attributes and methods not relevant
}

我正在使用 Spring 数据为实体创建存储库。

位置存储库

public interface LocationRepository extends JpaRepository<Location, Long>
{ }

我遇到的问题是我需要 id 以便能够从数据库中检索不同的对象,并且它是自动生成的。我可以通过元素访问 id 的唯一方法是当我将托管对象保存到数据库时获取它。但是,如果我尝试像这样依次保存每个位置:

Home home = new Home();
home = locationService.save(home) // service that just calls locationRepository.save method
Room bedroom = new Room(home);
bedroom = locationService.save(bedroom);

我在数据库中得到一个重复的房间条目,我认为这与 Hibernate 问题https://hibernate.onjira.com/browse/HHH-7404有关。如果我只是打电话

Home home = new Home();
Room bedroom = new Room(home);
locationService.save(home) 

没有双打,但我无法检索房间对象,因为它在级联上持续存在并且它的 ID 为 0。有没有办法解决这个问题而无需在该位置引入其他字段,例如我必须自己生成的唯一名称? 任何帮助深表感谢。

编辑

如果在最后一种情况下我有home = locationService.save(home)然后调用home.getUuid()我得到正确的值,我认为这是正常的,因为我检索了一个托管对象。但是如果我这样做,bedroom.getUuid()我会得到 0,因为卧室没有被管理,所以它的 id 字段没有用数据库中的值更新。

4

1 回答 1

0

您是否尝试home.getUuid();在持久调用之后调用(假设您有该字段的吸气剂)?

您可能会感到惊讶,但 Hibernate(和 JPA)将使用 id 更新内存中的副本。

于 2013-03-13T15:35:13.753 回答