SPS hibernace a dědičnost Table_Per_class

hlasů
0

Mám subjekt, který je super třída

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = super_class)
public abstract class SuperClass implements Serializable {
    @Transient
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;

    public abstract void initDefaultValues();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

}

a některé podtřídy, které rozšiřují rodičovské třídy.

@Entity
@Table(name = Subclass1)
public class Subclass1 extends SuperClass{

    private static final Logger log = LogManager
            .getLogger(Subclass1.class);
    @Transient
    private static final long serialVersionUID = 1L;

    // testcase configuration tab
    private String configurationTabTestServer;


    private String umtsRelease;


}

Ostatní třídy vypadají stejně.

Míval jsem jim SINGLE_TABLE typu dědičnosti, ale my jsme chtěli každou třídu betonu mít každý vlastní stůl. Kvůli TABLE_PER_CLASS jsem musel použít GenerationType.TABLE.

Mám také třídu entity, která má cizí klíč pro super třídu

@Entity
@Table(name=myother_entity)
class Entity1{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne(cascade = CascadeType.ALL)
    private SuperClass superclass;
    //more fields
}

Použil jsem abstraktní třídu, protože mám jednu Entity1 třídu, která by mohla mít jiný typ super třídy. Nechtěli jsme vytvořit jinou Entity1 a Entity2 a Entity3 atd tříd pro každou podtřídy. Tak jsme vytvořili jednu třídu Entity1, které mohou mít pole typu nadřazené, které by mohly ukazovat na některou z podtřídy.

Na mém programu jsem vytvořit mnoho intances Entity1, že některé z nich, které mají různé typy rodičovské třídě jako hodnoty pole. Každý může být typu subclass1 nebo subclass2 atd Zpočátku jsme byli zvyklí mít jednu tabulku pro všechny podtřídy. Všechno fungovalo dobře. Ale poté, co jsme se rozhodli rozdělit naše stoly to je to, co se děje. Když jsem upravit všechny instance Entity1, která má již supertřídou pole sady (pomocí jednoho z dílčích třídách), a uložit ji (sloučením) pak vytvoří novou instanci mé podtřídou spojené s mým například Entity1, a uloží ji do databáze. Takže mám dva záznamy nyní na stole podtřídy. To se nestalo, když jsme použili SINGLE_TABLE typ dědičnosti. Je to normální chování pro SPS a přezimovat?

Položena 03/08/2015 v 15:29
uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Prosím, nejprve za to: DiscriminatorColumn a DiscriminatorValue anotace jsou specifické pro jedinou tabulku přístupu. Takže nejsou pro použití v mapování tabulky za své třídě.

Nyní pojďme k otázce:

V mapování tabulky za své třídě, bude existovat dva záznamy se stejným ID: jednou v nadřazené tabulce, ostatní v podřízené tabulce.

Jak jsem pochopil, ve vašem případě, dva záznamy jsou psány v podřízené tabulce, ne? Pokud ano, tento problém musí být při načtení dat Entity1 z databáze. Vlastnost „nadřazenou“ musí mít ID sadu. Můžete použít dychtivý nebo líný nakládky za to. A zkontrolujte, zda je tento majetek vložen správně (v režimu ladění) s jeho správným ID sady před uložením.

Dalším způsobem je zakázat „kaskáda přetrvávají / sloučení“ a pro uložení entit samostatně. To může zajistit větší bezpečnost vašich dat.

Můžete si najít více informací zde: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

Odpovězeno 03/08/2015 v 16:01
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more