我有两个实体:一个歌手和一张专辑。辛格有几张专辑。我复制了歌手的精华,可以得到他的ID和名字,但我无法得到他的专辑列表。我有这样的感觉
线程“main”org.hibernate.LazyInitializationException中的异常:未能缓慢初始化角色集合:Entity.SingerEntity.Albums,无法初始化代理-没有会话
@Entity
@Table(name = "\"singer\"")
public class SingerEntity {
@Id
private int singer_id;
private String name;
@OneToMany(mappedBy = "singer_id", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AlbumEntity> albums;
public List<AlbumEntity> getAlbums() {
return albums;
}
public void setAlbums(List<AlbumEntity> albums) {
this.albums = albums;
}
@Entity
@Table(name = "album")
public class AlbumEntity {
@Id
private int album_id;
private String album_title;
private String genre;
private int singer_id;
主要方法:
public static void main(String[] args) {
SingerDAO sDAO = new SingerDAO();
AlbumDAO aDAO = new AlbumDAO();
SingerEntity s1 = new SingerEntity(1, "Singer");
sDAO.insert(s1);
AlbumEntity a1 = new AlbumEntity(1, "a1", "g1", s1);
AlbumEntity a2 = new AlbumEntity(2, "a2", "g1", s1);
AlbumEntity a3 = new AlbumEntity(3, "a3", "g2", s1);
AlbumEntity a4 = new AlbumEntity(4, "a4", "g2", s1);
aDAO.insert(a1);
aDAO.insert(a2);
aDAO.insert(a3);
aDAO.insert(a4);
s1 = sDAO.findById(1);
System.out.println(s1.getId() + " , " + s1.getName());
List<AlbumEntity> albums = s1.getAlbums();
System.out.println(albums.get(0).getAlbum_title());
}
public class SingerDAO {
public SingerEntity findById(int id) {
Session session = null;
SingerEntity singer = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
singer = (SingerEntity) session.get(SingerEntity.class, id);
Hibernate.initialize(singer);
} catch (Exception e){
e.printStackTrace();
} finally {
if (session != null && session.isOpen()){
session.close();
}
}
return singer;
}
public void select(){
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query query= session.createQuery("from SingerEntity");
List<SingerEntity> list = query.list();
for (SingerEntity s:list) {
System.out.println(s.getName());
}
session.getTransaction().commit();
session.close();
}
public void insert(SingerEntity singerEntity){
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(singerEntity);
session.getTransaction().commit();
session.close();
}
public void update(SingerEntity sE){
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.update(sE);
session.getTransaction().commit();
session.close();
}
public void delete(SingerEntity sE){
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.delete(sE);
session.getTransaction().commit();
session.close();
}
}
首先,正确地映射一个任意的双向关系。你应该
@Entity
@Table(name = "singer")
public class SingerEntity {
...
@OneToMany(mappedBy = "singer", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AlbumEntity> albums;
...
}
@Entity
@Table(name = "album")
public class AlbumEntity {
...
@ManyToOne
@JoinColumn(name = "singer_id)
private SingerEntity singer;
....
}
如果您想更好地将album添加到实体,可以在Singer实体上使用自定义方法来保持引用的正确性,如:
public void addAlbum(AlbumEntity a) {
albums.add(a);
a.setSinger(this);
}
之后,您可以保存专辑只是坚持歌手,因为您有级联选项。
SingerDAO sDAO = new SingerDAO();
AlbumDAO aDAO = new AlbumDAO();
SingerEntity s1 = new SingerEntity(1,"Singer");
s1.addAlbum(new AlbumEntity(1,"a1","g1",1));
s1.addAlbum(new AlbumEntity(2,"a2","g2",1));
s1.addAlbum(new AlbumEntity(3,"a3","g3",1));
s1.addAlbum(new AlbumEntity(4,"a4","g4",1));
sDAO.insert(s1);
public SingerEntity findById(int id) {
Session session = null;
SingerEntity singer = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
//start transaction
singer = (SingerEntity) session.get(SingerEntity.class, id);
Hibernate.initialize(singer);
//end transaction
} catch (Exception e){
e.printStackTrace();
} finally {
if (session != null && session.isOpen()){
session.close();
}
}
return singer;
}
我试图在多对一关系字段上使用Java的Hibernate@Filter,但当我启用该过滤器并尝试使用AJAX中的StockDailyRecord服务调用getAll方法时,我得到了以下结果: 这是我定义过滤器的实体: 但是,当我用数据库“stock_id”中的实际列更改过滤器,并将其与我希望的id进行比较时,过滤器可以正常工作。 以下是我如何在StockDailyRecordService中启用过
我的远程接口是: 我的EJB实现是: 每次当我调用实体方法getFileId()时, 编辑: 当我试图使用JPA2.0提供的方法访问实体的主键时: 我得到了同样的错误回报。烦人??
直截了当地说:我有一个包含项目的小组。我想用外键处理这个关联,这就是为什么它有一个mappedby标记。我的问题是,如果我查询组,我会进入一个有限循环,其中组列出了包含该组的项目,该组列出了再次包含该组的项目。。。。。等等我的实体(最小版本): 有人能帮助如何避免这个循环吗?如果我在DBGroup中将fetchtype更改为懒,我就会得到一个LazyLaunalizationEXcep。 感谢您的
我希望能够复制Jhipster中某个实体的现有条目。举个例子:jhipster条目 但我不知道从哪里开始,如何开始。 编辑:我是初学者。我必须在后端和前端进行更改,但我的问题是关于后端的。
我想通过在父实体上调用保存来将父实体和子实体一起保存到MySQL数据库中。父实体和子实体之间有一对一的映射。父ID是自动生成的,我们需要在子实体中使用与子实体相同的pk。 我使用的是Spring数据JPA2.0(JPA提供程序是Hibernate)和Spring MVC框架。当尝试插入实体时,我遇到以下错误。 根本原因 这是我的数据库模式: 以下是我的Java实体父实体: 儿童性: 这是我的主要方
我需要记录各种业务,他们的城市和他们在每个城市的分支机构。每个企业可能在不同的城市,在每个城市可能有不同的分支机构。