使用@IdClass时如何防止保存被引用的实体?

时间:2017-07-14 09:39:12

标签: spring hibernate

我有两个实体FILESPATH=/home/ubuntu/work/test/ INPUT=/home/ubuntu/work/files.txt i=0 while read line do FILES[ $i ]="$line" (( i++ )) done < <(ls $FILESPATH/*.txt) for file in "${FILES[@]}" do echo -n " ${file##*/}" done echo "" while IFS= read -r var do echo -n "$var " for file in "${FILES[@]}" do VALUE=`grep "$var " $file | cut -d ' ' -f3` if [ ! -z $VALUE ]; then echo -n "$VALUE " else echo -n "NA " fi done echo "" done < "$INPUT" Type。每个TypeValue可以包含多个Type个。在尝试保留新TypeValue时,我收到TypeValue已存在的数据库错误(这是正确的,但我不想再添加它,我想添加一个新的'TypeValue “)。我有类似的没有Type的类正在工作,所以我假设@IdClass定义是错误的,或者我忘了定义某些内容,以便不更新引用的对象。

如何在IdClass使用Type时阻止保存被引用实体@IdClass

班级定义:

TypeValue

使用示例:

@Entity
@Table(name = "TYPE", schema = "VOC")
public class Type implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @Column(name = "TYPEID")
  private String typeID;

  @Column(name = "NAME")
  private String name;

  @OneToMany(mappedBy = "type")
  private List<TypeValue> listTypeValue;

  // constructor, getter, setter, equals, hashcode, ...
}

@Entity
@IdClass(TypeValueID.class)
@Table(name = "TYPE_VALUE", schema = "VOC")
public class TypeValue implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @ManyToOne
  @JoinColumn(name = "TYPEID")
  @ForeignKey(name = "TYPEVALUE_FK")
  private Type type;

  @Id
  @Column(name = "VALUE")
  private String value;

  // constructor, getter, setter, equals, hashcode, ...
}

public class TypeValueID implements Serializable {
  private static final long serialVersionUID = 1L;

  String type;
  String value;

  // equals, hashcode
}

抛出异常:

Type type = ... // get existing type with typeID "DETAIL"

Session session = sessionFactory.getCurrentSession();
TypeValue newTypeValue = new TypeValue(type, "new value");
session.save(newTypeValue);
session.flush();

3 个答案:

答案 0 :(得分:0)

请将 String typeID 更改为int或long。然后使用@GeneratedValue进行自动增量。

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private int typeID ;

检查此示例

@Entity
@Table(name = "USERS")
@Proxy(lazy = false)
public class User {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private int uID ;

private String uName ;
private String uEmail ;
private String uPassword;

@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
private List<Reminder> uReminders = new ArrayList<>();

下一个实体

@Entity
@Proxy(lazy = false)
public class Reminder {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private int reminderID ;

private Date reminderDate ;
private String reminderDescription ;

答案 1 :(得分:0)

您已使用@Id。

定义了外键列
  @Id
  @ManyToOne
  @JoinColumn(name = "TYPEID")
  @ForeignKey(name = "TYPEVALUE_FK")
  private Type type;

因此,期望“类型”列中的唯一值。希望这可能会有所帮助。

答案 2 :(得分:0)

type类中的TypeValueID属性错误,该类应如下所示:

public class TypeValueID implements Serializable {
  private static final long serialVersionUID = 1L;

  Type type;
  String value;

  // equals, hashcode
}

JPA Persistence API 2.1 documentation州:

  

主键类和字段中的字段或属性的名称   主要字段或实体的属性必须对应和   它们的类型必须根据Section中指定的规则进行匹配   2.4,“主键和实体标识”和第2.4.1节“与派生标识相对应的主键”。

在这种情况下适用的规则是:

  

如果复合主键类表示为id类,则   主键类和主键字段或属性的名称   id类映射到的实体类的那些必须   对应,它们的类型必须相同。