Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate namingstrategy / 7 сообщений из 7, страница 1 из 1
07.04.2021, 16:22
    #40060427
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
Entity:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Customers")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String firstName;
	private String lastName;
	@Column(name = "email")
	private String emailAddress;

	public Long getId() {
		return id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmailAddress() {
		return emailAddress;
	}

	public void setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
	}

}



Таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `customers` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;



Настройки EntityManagerFactory:
Код: java
1.
2.
hibernate.physical_naming_strategy = xxx.naming_strategy.CustomPhysicalNamingStrategy
hibernate.hbm2ddl.auto = none



Класс CustomPhysicalNamingStrategy
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {

	@Override
	public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	private Identifier convertToSnakeCase(final Identifier identifier) {
		if (identifier != null) {
			final String regex = "([a-z])([A-Z])";
			final String replacement = "$1_$2";
			final String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();

			return Identifier.toIdentifier(newName);
		} else {
			return null;
		}
	}
}



Тестовый код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		doInJPA(entityManager -> {

			Customer customer = new Customer();
			customer.setEmailAddress("Some@mail.com");
			customer.setFirstName("FirstName");
			customer.setLastName("LastName");

			entityManager.persist(customer);

		});



Hibernate log выполнения тестового кода:
Код: java
1.
2.
3.
4.
Hibernate: alter table Customers add column firstName varchar(255)
Hibernate: alter table Customers add column lastName varchar(255)

Hibernate: insert into customers (email, first_name, last_name) values (?, ?, ?)



Коротко как должно быть:

В Hibernate применяется двухступеньчатая стратегия именования таблиц и полей:
1) Определение логического имени.
2) Определение физического имени.

На первом этапе определяются логические имена (ImplicitNamingStrategy = default):
Код: java
1.
2.
3.
4.
	private String firstName;           - логическое имя в таблице "firstName"
	private String lastName;            - логическое имя в таблице "lastName"
	@Column(name = "email")
	private String emailAddress;      - логическое имя в таблице "email"



На втором этапе на основании логических имен должны получить физические (используется hibernate.physical_naming_strategy = xxx.naming_strategy.CustomPhysicalNamingStrategy, которая заменяет кэмалкейс на нижнее подчеркивание и заменяет заглавные буквы прописными)

Код: java
1.
2.
3.
4.
	private String firstName;           - логическое имя в таблице "firstName",  физ. имя = "first_name"
	private String lastName;            - логическое имя в таблице "lastName",  физ. имя = "last_name"
	@Column(name = "email")
	private String emailAddress;      - логическое имя в таблице "email",  физ. имя = "email"



Ну и в примере должно произвестить вставка записи в колонки с физ именами. Это и происходит:
Код: java
1.
Hibernate: insert into customers (email, first_name, last_name) values (?, ?, ?)



Но почему перед этим происходит еще добавление двух колонок?:
Код: java
1.
2.
Hibernate: alter table Customers add column firstName varchar(255)
Hibernate: alter table Customers add column lastName varchar(255)
...
Рейтинг: 0 / 0
07.04.2021, 16:31
    #40060435
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
Если явно задать имена колонок:
Код: java
1.
2.
3.
4.
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;

, то результат тот же.
...
Рейтинг: 0 / 0
07.04.2021, 16:59
    #40060453
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
Отбой, у меня косяк был. Все работает как положено.
...
Рейтинг: 0 / 0
10.04.2021, 20:55
    #40061384
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
могу сказать нейкий лайф хак - некие анотации ,которые именуются идентично в пакете перситстенс и в пакете хибера работают по разному- и это надо учитывать


я тут запарился и смог с помощью хибера вызывать хранимые процедуры с параметрами,причем видимость настраиваемая-очень крутая штука- такое мало кто умеет- а по факту можно почти половину логики вынести на бд сервак - решив тем самым проблему производительности в каких то случаях,при этом не отазываться от ORM
...
Рейтинг: 0 / 0
11.04.2021, 00:14
    #40061403
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
asv79,
Нет уж. Либо хранимки либо ОРМ.
...
Рейтинг: 0 / 0
11.04.2021, 17:08
    #40061461
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
PetroNotC Sharp
asv79,
Нет уж. Либо хранимки либо ОРМ.

ничто не мешает использовать все вместе
...
Рейтинг: 0 / 0
12.04.2021, 07:02
    #40061555
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate namingstrategy
asv79
PetroNotC Sharp
asv79,
Нет уж. Либо хранимки либо ОРМ.

ничто не мешает использовать все вместе
когда начинаешь рассуждать про архитектуру - получается плохо.
Вместе это Г....
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate namingstrategy / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]