我正在尝试找到一种方法来检索通过级联保存在数据库中的实体的自动生成的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
}
家庭类扩展位置,引用一组房间
@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数据为实体创建存储库。
LocationRepository
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字段。
答案 0 :(得分:0)
您是否尝试在保留呼叫后调用home.getUuid();
(假设您有该字段的getter)?
您可能会感到惊讶,但Hibernate(和JPA)将使用id更新内存副本。