Hibernate: Ein Fluch

Kababär

Top Contributor
Hi,


nach unzähligen Änderungen an der Datenbank und meiner Entity-Klassen (Java) habe ich nun die Klassen mit NetBeans generieren lassen. Leider tritt immer noch ein Fehler auf:

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [FK_VIDEO_ID] in table [FRAME]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:136)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:309)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:889)
... 33 more

Die von Netbeans generierten Klasse:
Code:
@Entity
@Table(name = "FRAME")
@XmlRootElement
@NamedQueries({
        @NamedQuery(name = "Frame.findAll", query = "SELECT f FROM Frame f")})
public class Frame implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "FID")
    private Integer fid;
    @Column(name = "FRAME_NUMBER")
    private Integer frameNumber;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkFrameId")
    private Collection<Rectangle> rectangleCollection;
    @JoinColumn(name = "FK_VIDEO_ID", referencedColumnName = "VID")
    @ManyToOne(optional = false)
    private Video fkVideoId;

//Constructor, getter & setter

}

Code:
@Entity
@Table(name = "VIDEO")
@XmlRootElement
@NamedQueries({
        @NamedQuery(name = "Video.findAll", query = "SELECT v FROM Video v")})
public class Video implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "VID")
    private Integer vid;
    @Column(name = "PATH")
    private String path;
    @Column(name = "FPS")
    private Integer fps;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkVideoId")
    private Collection<Frame> frameCollection;

// ....

}

Und so sieht die Tabelle Frame in h2 aus:

frame_schema.PNG

Ich verstehe die Fehlermeldung also nicht. Die Spalte existiert doch?
Die Idee ist, dass ein Video mehrere Frames hat, also eine 1 zu n Beziehung.
Dabei will ich aber gerne eine bidirektionale Verbindung, um schneller von einem Frame auf das dazugehörige Video zu kommen.

Kann mir jemand weiterhelfen?
 
Ja, ist sie.
Hier mal eine Ausgabe von SCRIPT TO '...':
CREATE CACHED TABLE PUBLIC.VIDEO(
VID INT NOT NULL,
PATH VARCHAR(255),
FPS INT
);
ALTER TABLE PUBLIC.VIDEO ADD CONSTRAINT PUBLIC.CONSTRAINT_4 PRIMARY KEY(VID);
-- 0 +/- SELECT COUNT(*) FROM PUBLIC.VIDEO;
CREATE CACHED TABLE PUBLIC.FRAME(
FID INT NOT NULL,
FRAME_NUMBER INT,
FK_VIDEO_ID INT NOT NULL
);
ALTER TABLE PUBLIC.FRAME ADD CONSTRAINT PUBLIC.CONSTRAINT_40 PRIMARY KEY(FID);
-- 0 +/- SELECT COUNT(*) FROM PUBLIC.FRAME;

ALTER TABLE PUBLIC.FRAME ADD CONSTRAINT PUBLIC.CONSTRAINT_400 FOREIGN KEY(FK_VIDEO_ID) REFERENCES PUBLIC.VIDEO(VID) NOCHECK;
 
Ich habe folgendes weggelassen und nun geht es...

Code:
@XmlRootElement
@NamedQueries({
        @NamedQuery(name = "Video.findAll", query = "SELECT v FROM Video v")})
 

Neue Themen


Zurück
Oben