我有两个实体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();
答案 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类映射到的实体类的那些必须 对应,它们的类型必须相同。