我有两个例子。一个是项目,一个是模块。< code >一对多关系。
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "project", uniqueConstraints = { @UniqueConstraint(columnNames = { "name", "version" }) })
public class Project implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "version")
private String projectVersion;
@Column(name = "description")
private String description;
@Column(name = "is_cartridge")
private boolean cartridge;
@Column(name = "manifest")
private String manifest;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "project_id")
private Set<Module> modules = new HashSet<Module>();
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "module", uniqueConstraints = { @UniqueConstraint(columnNames = { "project_id", "name", "module_id" }) })
public class Module implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@Column(name = "module_id")
private String moduleId;
@Column(name = "version")
private String version;
@Column(name = "type")
private String type;
@Column(name = "resource")
private String resource;
@OneToOne
@JoinColumn(name = "default_language_id")
private Locality defaultLocality = new Locality();
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "project_id")
private Project project = new Project();
@OneToMany(mappedBy = "module", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "module_id")
private Set<KeyValue> keyValues = new HashSet<KeyValue>();
我将模块设置到项目中。然后使用session.save(项目)
。第一次,因为数据库中没有记录,所以项目和模块可以保存到数据库中。然而,第二次,因为我不需要创建新项目,我只创建新模块,然后将模块设置回项目。
发生异常。
对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。
@Transactional
public Project save(Project project) {
Session session = sessionFactory.openSession();
try {
Criteria criteria = session.createCriteria(Project.class).add(
Restrictions.eq("name", project.getName()));
List<Project> list = criteria.list();
if (list.size() == 0) {
Integer id = (Integer) session.save(project);
project = get(id);
return (project);
} else {
Project persistedModule = list.get(0).merge(project);
session.update(persistedModule);
session.flush(); **// Problem occurs in this line.**
return (persistedModule);
}
} finally {
session.close();
}
}
有什么办法可以解决这个问题吗谢谢
您的映射是错误的:
JoinCol的
注释。顺便说一句,您为其他关联重复了这些错误。
您还对附加的项目(称为< code>persistedModule,这使事情变得非常混乱)调用了< code>update(),因为它是前面的< code>merge()调用的结果。更新附加的对象是没有用的。已经附加了,所以没有理由再附加了。
我不确定这是否能解决您的问题,因为如果没有代码和堆栈跟踪,很难知道实际的问题是什么,但是我会从解决这些问题开始
上图显示了表之间的关系。 AddressType表包含静态值,如mailing、home、work等。 在AddressTypeRel模型类中,我有一个带有多对一注释的AddressType对象
错误: 我还尝试了,但是 病因是什么?显然,我设置了nullable=true(在数据库中也是如此),尽管我有这个错误。有什么想法吗?
user.java是 我正在使用这个视频中提到的存储库,是 和 这个问题有什么更好的解决办法吗?
我试图将用户详细信息存储到以下表中:user、role、user_role。当试图保存详细信息时,它会引发以下错误。 托管刷新时出错[org.hibernate.transientPropertyValueException:object引用未保存的瞬态实例-在刷新前保存瞬态实例 这里user_role是父表,user和role表是子表。我尝试了cascade=cascade.all。即使它也会犯
在baseEntity中具有Id
我正在使用Seam Framework。我有2个实体: Request.java 和请求事件.java 当我进行此交易时: 我得到了这个错误: