2014-11-07 4 views
4

Рассмотрим диаграмму:Каким образом сохраняются расширенные классы?

image

Я работаю с JPA в течение короткого промежутка времени, и до сих пор, я никогда не имел необходимости упорствовать расширенные классы ... Как вы можете видеть на Например, SNMPNode, IPNode и т. д. все расширенные классы от Node, которые также распространяются от GeoLocation.

Я понимаю, что я могу аннотировать мастер-классы с @MappedSuperclass и IPNode и SNMPNode наследуют свои свойства сохраняющиеся ... Но в этом случае я в конечном итоге с почти идентичных таблиц и, в моем понимании, вместо того, чтобы делать это Я мог бы просто сгруппировать всю информацию в узле и работать с одной таблицей.

Является ли это продолжением расширенных классов в работе JPA или моими понятиями являются неправильными?

То же самое, возобновленного кусок кода:

public class Node extends GeoLocation { 
    private String name; 
    private Group group; 
    private Location location; 
    private Type type; 
    private Company company; 
} 

public class IPNode extends Node { 
    private Long id; 
    private String ipAddress; 
} 

public class SNMPNode extends Node { 
    private Long id; 
    private SNMPServer server; 
} 

[[РЕДАКТИРОВАНИЕ ПОСЛЕ ОТВЕТА ОТ ЭТОЙ ТОЧКИ]]

Ради содействия, вот образец что я делаю:

ИНОД:

public interface INode { 
    public Long getId(); 
    public void setId(Long id); 

    public String getName(); 
    public void setName(String name); 

    public String getIpAddress(); 
    public void setIpAddress(String ipAddress); 

    public String getCommunity(); 
    public void setCommunity(String community); 
} 

Узел:

@Entity 
@DiscriminatorValue("N") 
@DiscriminatorColumn(name="NODE_TYPE",discriminatorType=DiscriminatorType.STRING, length=20) 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public abstract class Node extends GeoLocation implements INode { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

    public Long getId() {return id;} 
    public void setId(Long id) {this.id = id;} 

    public String getName() {return name;} 
    public void setName(String name) {this.name = name;} 

    (... Overrides from INode ...) 
} 

IPNode:

@Entity 
@DiscriminatorValue("I") 
public class IPNode extends Node { 
    private String ipAddress; 

    public String getIpAddress() { return this.ipAddress;} 
    public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } 

    (... Overrides from INode ...) 
} 

SNMPNode:

@Entity 
@DiscriminatorValue("S") 
public class SNMPNode extends Node { 
    private String community; 

    public String getCommunity() { return community;} 
    public void setCommunity(String community) { this.community = community; } 

    (... Overrides from INode ...) 
} 

NodeRepository:

@Repository 
public interface NodeRepository extends JpaRepository<Node, Long> { } 

Так что теперь я могу делать вещи, как это:

@ContextConfiguration("classpath:/spring/application-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
public class NodeRepositoryTest { 

    @Autowired 
    NodeRepository repo; 

    private INode node; 

    @Before 
    @Transactional 
    @Rollback(false) 
    public void setup() { 
     node = new IPNode(); 
     node.setName("ipNode"); 
     node.setIpAddress("1.1.1.1"); 
     repo.save((IPNode)node); 

     node = new SNMPNode(); 
     node.setName("snmpNode"); 
     node.setIpAddress("2.2.2.2"); 
     node.setCommunity("some text"); 
     repo.save((SNMPNode)node); 
    } 

    @Test 
    @Transactional 
    public void Test() throws Exception { 
     INode testNode = repo.findOne(1L); 
     assertNotNull(testNode); 
    } 
} 

обоих типов узлов сохраняются на том же столе, и поэтому их ключи не могут повторить ... Мой REST URL может захватить их/узлами/1 или/узлы/2, который был моей главной целью в конце концов ...

Спасибо :)

+0

Простая проверка google («jpa inheritance»): вы получите http://en.wikibooks.org/wiki/Java_Persistence/Inheritance – jmvivo

+0

Очень приятные документы. Таблицы примеров очень легко понять. Благодарю. –

ответ

5

Если базовый класс помечаются @MappedSuperclass то наследование имеет значение только в контексте ООП. Свойства @MappedSuperclass просто копируются в каждую соответствующую таблицу базы данных подкласса, и вы можете запрашивать только объекты сущностей.

Single table inheritance дает наилучшую производительность (без участия или объединения) по цене, не позволяющей объявлять не-нулевым все специфические свойства подкласса (поскольку все базовые и все свойства подкласса относятся к одному таблица базы данных).

С joined inheritance tables вы можете иметь свойства базового класса в базе данных базы данных, и каждый конкретный подкласс имеет свою собственную связанную таблицу. Таблица подкласса связана с базой данных базы данных через FK, поэтому вам нужно присоединиться к этим таблицам, чтобы получить объект подкласса. Как opossed к @MappedSuperclass, базовый класс доступен для запроса, поскольку контекст ООП и база данных отражают модель наследования.

+0

Ваш ответ вместе с этими документами http://en.wikibooks.org/wiki/Java_Persistence/Inheritance облегчил мне понимание. Благодарю. Моя главная проблема заключалась в том, что это будет приложение REST, а узлы будут получены с помощью URL-адреса, например/nodes/. Но мне нужен тот же URL-адрес для IPNode или SNMPNode, и идентификаторы на этих классах не будут работать, потому что они могут повториться ... Думаю, мне нужен абстрактный класс Node с полем ID в нем, а затем решить между любым из наследований таблицы , –

Смежные вопросы