0

私は次のクラスを持っています:

ハードウェア.java

    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    public class Hardware{
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private long id;
    private String serialnumber;    

    @OneToMany (mappedBy="hardware")
    private List<Equipment> equipments;
}

コンピューター.java

    @Entity
    public class Computer extends Hardware {

    private String hostname;
    private String macAdress;
    private String ipNumber;

    public Computer(){
        super();
    }

    public Computer(String serialnumber, String hostname,
        String macAdress, String ipNumber) {
        super(serialnumber);
        this.hostname = hostname;
        this.macAdress = macAdress;
        this.ipNumber = ipNumber;
    }
}

NetworkDeivce.java

    @Entity
    public class NetworkDevice extends Hardware {

    private String hostname;
    private String ipAdress;

    public NetworkDevice(){
        super();
    }

    public NetworkDevice(String serialnumber, String hostname,
            String ipAdress) {
        super(serialnumber);
        this.hostname = hostname;
        this.ipAdress = ipAdress;
    }
}

次に、ハードウェア クラスにマップされるクラス:

機器.java

@Entity
public class Equipment {

    public Equipment(){
    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    private String serialnumber;
    private String info;

    @ManyToOne (fetch=FetchType.EAGER)
    @JoinColumn(name="HW_ID")
    private Hardware hardware;
}

ここで、コンピューターに機器を追加するとすべて正常に動作しますが、ネットワーク デバイスに機器を追加しようとすると、次のエラーが発生します: 内部例外:

内部例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`inventorytool_beta`.`EQUIPMENT`, CONSTRAINT `FK_EQUIPMENT_HW_ID` FOREIGN KEY (`HW_ID`) REFERENCES `COMPUTER` (`ID`))
Error Code: 1452
Call: INSERT INTO EQUIPMENT (INFO, SERIALNUMBER, HW_ID) VALUES (?, ?, ?)
    bind => [3 parameters bound]
Query: InsertObjectQuery(domain.hardware.Equipment@600a620d)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
    at main.dbTest(main.java:74)
    at main.main(main.java:18)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`inventorytool_beta`.`EQUIPMENT`, CONSTRAINT `FK_EQUIPMENT_HW_ID` FOREIGN KEY (`HW_ID`) REFERENCES `COMPUTER` (`ID`))
Error Code: 1452
Call: INSERT INTO EQUIPMENT (INFO, SERIALNUMBER, HW_ID) VALUES (?, ?, ?)
    bind => [3 parameters bound]
Query: InsertObjectQuery(domain.hardware.Equipment@600a620d)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:851)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:913)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`inventorytool_beta`.`EQUIPMENT`, CONSTRAINT `FK_EQUIPMENT_HW_ID` FOREIGN KEY (`HW_ID`) REFERENCES `COMPUTER` (`ID`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

だから私はそれが継承の問題だと思う...私はJPAがあまり得意ではない..

前もって感謝します。

4

3 に答える 3

1

生成されたスキーマを見てください。Hardware継承戦略により、ハードウェア用Computerに3 つの異なるテーブルが必要ですNetworkDevice。問題は、HW_ID1 つのテーブルしか参照できないことです。ここでは、JPA プロバイダーが を選択Computerしました。これはおそらくアルファベット順で最初にあるためですが、3 つのクラスすべてを処理することはできません。

のような別の継承戦略を使用することを検討してくださいJOIN

于 2013-04-11T12:53:30.557 に答える
0

はい、それはあなたの継承戦略から来ています。@GeneratedValue(strategy=GenerationType.IDENTITY)とは併用できませんtable_per_class

Java/Hibernate JPA: InheritanceType.TABLE_PER_CLASS および IDを参照してください。

于 2013-04-11T14:33:04.317 に答える
0

Equipment を NetworkDevice に挿入するコードを確認してください。マスターテーブル(ハードウェア)にHW_IDが存在しないようです。存在しないマスターテーブル HW_ID を子テーブル(機器)の外部キーとして挿入しようとしているためです。

よろしく、ラヴィ

于 2013-04-11T12:42:58.800 に答える